package com.yunke.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yunke.dto.service.YunkeServiceBookDto;
import com.yunke.dto.service.YunkeServicePublishDto;
import com.yunke.entity.YunkeService;
import com.yunke.vo.service.YunkeServiceVo;

import java.util.List;

/**
 * 服务Service接口
 * 
 * @author yunke
 * @since 1.0.0
 */
public interface YunkeServiceService extends IService<YunkeService> {

    /**
     * 获取服务分类列表
     * 
     * @return 分类列表
     */
    List<YunkeServiceVo.CategoryInfo> getServiceCategory();

    /**
     * 发布服务
     * 
     * @param publishDto 发布服务DTO
     * @return 服务ID
     */
    Long publishService(YunkeServicePublishDto publishDto);

    /**
     * 获取服务列表
     * 
     * @param current 当前页码
     * @param size 每页大小
     * @param categoryId 分类ID
     * @param serviceType 服务类型
     * @param keyword 关键词
     * @param sortType 排序类型：1-综合排序 2-价格升序 3-价格降序 4-评分排序 5-距离排序
     * @param longitude 经度（距离排序时需要）
     * @param latitude 纬度（距离排序时需要）
     * @return 服务列表
     */
    Page<YunkeServiceVo> getServiceList(Long current, Long size, Long categoryId, Integer serviceType, 
                                       String keyword, Integer sortType, Double longitude, Double latitude);

    /**
     * 获取服务详情
     * 
     * @param serviceId 服务ID
     * @return 服务详情
     */
    YunkeServiceVo getServiceDetail(Long serviceId);

    /**
     * 预订服务
     * 
     * @param bookDto 预订DTO
     * @return 订单ID
     */
    Long bookService(YunkeServiceBookDto bookDto);

    /**
     * 订单支付
     * 
     * @param orderId 订单ID
     * @param payMethod 支付方式：1-余额支付 2-微信支付 3-支付宝支付
     * @param payPassword 支付密码（余额支付时需要）
     * @return 支付结果
     */
    Object payServiceOrder(Long orderId, Integer payMethod, String payPassword);

    /**
     * 确认服务订单
     * 
     * @param orderId 订单ID
     * @return 操作结果
     */
    boolean confirmServiceOrder(Long orderId);

    /**
     * 完成服务订单
     * 
     * @param orderId 订单ID
     * @return 操作结果
     */
    boolean completeServiceOrder(Long orderId);

    /**
     * 我发布的服务
     * 
     * @param current 当前页码
     * @param size 每页大小
     * @param status 服务状态
     * @return 服务列表
     */
    Page<YunkeServiceVo> getMyPublishedService(Long current, Long size, Integer status);

    /**
     * 我的服务订单
     * 
     * @param current 当前页码
     * @param size 每页大小
     * @param orderType 订单类型：1-我购买的 2-我提供的
     * @param status 订单状态
     * @return 订单列表
     */
    Page<Object> getMyServiceOrder(Long current, Long size, Integer orderType, Integer status);

    /**
     * 评价服务
     * 
     * @param orderId 订单ID
     * @param rating 综合评分
     * @param serviceRating 服务态度评分
     * @param skillRating 专业能力评分
     * @param timeRating 时效性评分
     * @param valueRating 性价比评分
     * @param content 评价内容
     * @param images 评价图片
     * @param isAnonymous 是否匿名
     * @param tags 评价标签
     * @return 操作结果
     */
    boolean reviewService(Long orderId, Double rating, Double serviceRating, Double skillRating, 
                         Double timeRating, Double valueRating, String content, String images, 
                         Boolean isAnonymous, String tags);

    /**
     * 获取服务评价列表
     * 
     * @param serviceId 服务ID
     * @param current 当前页码
     * @param size 每页大小
     * @param ratingFilter 评分筛选：0-全部 1-好评 2-中评 3-差评
     * @return 评价列表
     */
    Page<Object> getServiceReviewList(Long serviceId, Long current, Long size, Integer ratingFilter);

    /**
     * 取消服务订单
     * 
     * @param orderId 订单ID
     * @param cancelReason 取消原因
     * @return 操作结果
     */
    boolean cancelServiceOrder(Long orderId, String cancelReason);

    /**
     * 申请退款
     * 
     * @param orderId 订单ID
     * @param refundReason 退款原因
     * @return 操作结果
     */
    boolean applyRefund(Long orderId, String refundReason);
} 